package com.hzw.saas.api.old.storage;

import java.util.List;

import com.hzw.saas.api.old.storage.bo.ResourceFolderBO;
import com.hzw.saas.api.old.storage.enums.ConflictModeEnum;


/**
 * 文件目录接口
 *
 * @author zzl
 * @since 02/23/2021
 */
public interface IResourceFolderService {

    /**
     * 获取目录路径
     * @param pidPath 目录ID路径
     * @return 目录路径，null-ID路径中某目录不存在
     */
    String getPathByPidPath(String pidPath);

    /**
     * 获取目录路径
     * @param pidPath 目录ID路径
     * @return 目录路径，null-ID路径中某目录不存在
     */
    String getPathByPidPath(List<String> pidPath);

    /**
     * 检查根目录下子目录名是否存在
     * 注：只检查正常状态的目录
     *
     * @param ownerId    所有者ID
     * @param catalog    存储桶
     * @param folderName 目录名
     * @return true 存在, false 不存在
     */
    boolean isNameExistsInRoot(String ownerId, String catalog, String folderName);

    /**
     * 检查目录下子目录名是否存在
     * 注：只检查正常状态的目录
     *
     * @param parentId   父目录ID
     * @param folderName 目录名
     * @return true 存在, false 不存在
     */
    boolean isNameExistsInFolder(String parentId, String folderName);

    /**
     * 检查根目录下的指定子路径是否存在
     * 注：只检查正常状态的目录
     *
     * @param ownerId
     * @param catalog
     * @param path
     * @return
     */
    boolean isPathExistsInRoot(String ownerId, String catalog, String path);

    /**
     * 检查目录下的指定子路径是否存在
     * 注：只检查正常状态的目录
     *
     * @param parentId 父目录ID
     * @param path     待检查路径
     * @return true 存在, false 不存在
     */
    boolean isPathExistsInFolder(String parentId, String path);

    /**
     * 根据目录ID获取目录信息
     *
     * @param folderId      目录ID
     * @param throwNotFound 是否检查存在性（为true时，若不存在则会抛出异常）
     * @return 目录信息
     */
    ResourceFolderBO getFolder(String folderId, boolean throwNotFound);

    /**
     * 根据目录ID获取目录信息
     *
     * @param folderId      目录ID
     * @param status        目录状态
     * @param throwNotFound 是否检查存在性（为true时，若不存在则会抛出异常）
     * @return 目录信息
     */
    ResourceFolderBO getFolder(String folderId, Integer status, boolean throwNotFound);

    /**
     * 获取目录及其子目录和文件信息
     *
     * @param folderId      目录ID
     * @param pathLevel     子目录层级
     *                      -1 获取所有子目录和文件,默认
     *                      0 获取目录自身信息
     *                      1 获取目录自身与1级子目录和文件信息
     *                      2 获取目录自身与1-2级子目录和文件信息
     *                      ...
     * @param widthFile     是否获取子文件
     * @param status        资源状态，为空则不过滤，可选
     * @param fileIntegrity 文件完整性状态，为空则不过滤，可选
     * @param throwNotFound 是否检查存在性（为true时，若不存在则会抛出异常）
     * @return 目录信息
     */
    ResourceFolderBO getFolder(String folderId, int pathLevel, boolean widthFile, Integer status, Integer fileIntegrity, boolean throwNotFound);

    /**
     * 获取根目录及其子目录和文件信息
     *
     * @param ownerId       所有者ID
     * @param catalog       存储桶
     * @param pathLevel     子目录层级
     *                      -1 获取所有子目录和文件,默认
     *                      0 获取目录自身信息
     *                      1 获取目录自身与1级子目录和文件信息
     *                      2 获取目录自身与1-2级子目录和文件信息
     *                      ...
     * @param widthFile     是否获取子文件
     * @param status        资源状态，为空则不过滤，可选
     * @param fileIntegrity 文件完整性状态，为空则不过滤，可选
     * @return
     */
    ResourceFolderBO getRootFolder(String ownerId, String catalog, int pathLevel, boolean widthFile, Integer status, Integer fileIntegrity);

    /**
     * 获取回收站文件
     *
     * @param ownerId
     * @param catalog
     * @return
     */
    ResourceFolderBO getArchiveFolder(String ownerId, String catalog);

    /**
     * 获取根目录下指定名称的目录
     * 只获取正常状态的目录
     *
     * @param ownerId
     * @param catalog
     * @param name
     * @param throwNotFound
     * @return
     */
    ResourceFolderBO getFolderByNameInRoot(String ownerId, String catalog, String name, boolean throwNotFound);

    /**
     * 获取父目录下指定名称的目录
     * 只获取正常状态的目录
     *
     * @param parentId
     * @param name
     * @param throwNotFound 是否检查存在性（为true时，若不存在则会抛出异常）
     * @return
     */
    ResourceFolderBO getFolderByName(String parentId, String name, boolean throwNotFound);

    List<ResourceFolderBO> listFolders(List<String> folderIds, Integer status);

    /**
     * 获取父路径
     *
     * @param folderId
     * @param throwNotFound
     * @return
     */
    String getFullPath(String folderId, boolean throwNotFound);

    /**
     * 获取归档目录列表（只显示顶层目录）
     *
     * @param ownerId
     * @param catalog
     * @return
     */
    List<ResourceFolderBO> listFolderOnStatus(String ownerId, String catalog, Integer status);

    long countFolderSize(String folderId);

    /**
     * 创建目录
     *
     * @param ResourceFolderBO   目录信息
     * @param conflictHandleEnum 冲突模式
     * @return 目录信息，当不检查同名目录且同名目录存在时，返回该同名目录
     */
    ResourceFolderBO createFolder(ResourceFolderBO ResourceFolderBO, ConflictModeEnum conflictHandleEnum);

    /**
     * 批次创建目录
     *
     * @param ownerId
     * @param creatorId
     * @param catalog
     * @param parentId  父目录ID
     * @param path      待创建目录路径，支持多级创建
     * @return 目录路径中的目录信息列表，已存在的目录也会返回，如/user/image即返回user和image目录的信息，无论是新建还是已存在
     */
    List<ResourceFolderBO> createFoldersByPath(String ownerId, String creatorId, String catalog, String parentId, String path);

    /**
     * 复制文件信息
     *
     * @param foldersId
     * @param targetParentId
     * @param conflictHandleEnum
     */
    void copyFoldersInfo(List<String> foldersId, String targetParentId, ConflictModeEnum conflictHandleEnum);

    /**
     * 复制文件信息
     *
     * @param foldersId
     * @param targetParentId
     * @param conflictHandleEnum
     */
    void moveFoldersInfo(List<String> foldersId, String targetParentId, ConflictModeEnum conflictHandleEnum);

    /**
     * 更新目录信息
     *
     * @param ResourceFolderBO 目录信息
     */
    void updateFolder(ResourceFolderBO ResourceFolderBO, boolean throwDeleted);

    /**
     * 更新目录状态，同时更新子目录及文件状态
     *
     * @param folderId 目录Id
     * @param status   目录状态
     */
    void updateFolderStatus(String folderId, Integer status, boolean throwDeleted);

    /**
     * 更新多个目录状态，同时更新子目录及文件状态
     *
     * @param folderIdList 目录Id列表
     * @param status       目录状态
     */
    void updateFoldersStatus(List<String> folderIdList, Integer status, boolean throwDeleted);

    /**
     * 更新目录中所有子文件和子目录状态
     *
     * @param parentFolderId 父目录ID
     * @param status         资源状态
     */
    void updateChildrenStatus(String parentFolderId, Integer status);

    /**
     * 根新根目录中所有子文件和子目录状态
     *
     * @param ownerId
     * @param catalog
     * @param status
     */
    void updateChildrenStatusInRoot(String ownerId, String catalog, Integer status);

    /**
     * 检查资是否属于用户
     *
     * @param folderId 目录ID
     * @param ownerId  用户ID
     * @return 结果 true/false
     */
    boolean checkAuthOwn(String folderId, String ownerId);
}
